/* Пример использования функции spi для сопряжения с АЦП AD7896 */

/* Чип: 90S8515
   Модель Памяти: SMALL
   Размер Стека Данных: 128 bytes
   Тактовая Частота: 4MHz */

/* АЦП AD7896, использующий шину SPI, подключен в соответствии с рис. 351 */
   
#include <90s8515.h> 	// подключаем  заголовочный файл используемого 
					// микроконтроллера AVR

#include <spi.h> 		// подключаем  функции SPI

/* Определим опорное напряжение VREF AD7896 в мВ */
#define VREF 5000L

/* Определим биты ПОРТА B для управляющих сигналов АЦП AD7896 */
#define _busy PINB.0 
#define n_convst PORTB.1

/* Определим функцию чтения из АЦП AD7896 */
unsigned int ADC_read(void) 	
{
unsigned int voltage; 	// определяем целую беззнаковую переменную
 	// voltage, в которой будет храниться значение
 	// напряжения, измеренное АЦП  AD7896 

/* начало преобразования в режиме 1 (высокое разрешение) */
n_convst =0; 		// формируем отрицательный импульс на выводе
n_convst =1; 		// NCONVST, по которому АЦП AD7896 начинает
// преобразование

/* ждем завершения преобразования, т.е. пока значение сигнала BUSY 
   не станет равным 0 */
while (_busy);

/* считаем результат преобразования из АЦП AD7896 */
voltage=spi(0); 				// читаем MSB (старший байт),
 	// используя функцию spi 
voltage=voltage<<8; 			// сдвигаем считанный байт на  бит,
 	// 8 т.е. переместим его в старший
 	// байт переменной  voltage

voltage|=spi(0); 				// читаем LSB (младший байт),
 	// используя функцию spi, выполняем
 	// поразрядное ИЛИ со значением
 	// переменной  voltage и полученное
 	// значение присваиваем переменной
 	// voltage

/* Таким образом, в старшем байте переменной voltage записан MSB
   результата преобразования АЦП AD7896, а в младшем байте - LSB */

/* Вычислим напряжение в мВ */
/* Чтобы не потерять значащие цифры, вычисления проведем с
   беззнаковыми длинными целыми (unsigned long), затем результат
   преобразуем в беззнаковое целое (unsigned) */
voltage=(unsigned) (((unsigned long) voltage*VREF)/4096L);

/* вернем измеренное напряжение в мВ */
return voltage;
}

/* Основная функция программы */ 

void main(void)
{
unsigned int voltage_ADC; 	// Объявляем переменную voltage_ADC,
							// где будет храниться значение 
							// напряжения, измеренное АЦП AD7896

/* инициализируем PORTB
0 бит - вход сигнала BUSY из АЦП AD7896;
1 бит - выход сигнала /CONVST на АЦП AD7896;
2 бит - вход (свободный);
3 бит - вход (свободный);
4 бит - выход (он зарезервирован под сигнал SPI/SS на случай
        наличия другого устройства на шине SPI);
5 бит - вход (свободный);
6 бит - вход сигнала SDATA из АЦП AD7896 (SPI MISO);
7 бит - выход сигнала SCLK на АЦП AD7896 (SPI SCK) */
	 
DDRB=0x92;

/* инициализируем SPI
прерывания 					- запрещены;
SPI						- разрешен;
порядок данных 				- MSB первый;
режим 					- master (мастера);
полярность тактовых импульсов 	- отрицательная;
фаза тактовых импульсов 		- по середине цикла;
тактовой частота SPI 			- SCK=fxtal/4 (кварц/4) */

SPCR=0x50;

/* инициализируем ПОРТ B
АЦП AD7896 будет работать в режиме 1 (высокое разрешение)
Начальные значения сигналов: /CONVST=1, SCLK=0 */

PORTB=2;

	/* считаем входное напряжение АЦП AD7896 */

     	voltage_ADC = ADC_read();
	... 			// далее в программе можно использовать 
				// текущее значение измеренного напряжения
}
